&minimum_width,
&natural_width);
+ minimum_width = MAX (minimum_width, requisition.width);
+ natural_width = MAX (natural_width, requisition.width);
- cached_size->minimum_size = MAX (minimum_width, requisition.width);
- cached_size->natural_size = MAX (natural_width, requisition.width);
+ /* XXX Possibly we should update this with minimum values instead */
+ _gtk_size_group_bump_requisition (GTK_WIDGET (layout), GTK_SIZE_GROUP_HORIZONTAL, natural_width);
+
+ cached_size->minimum_size = minimum_width;
+ cached_size->natural_size = natural_width;
cached_size->for_size = -1;
cached_size->age = aux_info->cached_width_age;
if (natural_width)
*natural_width = cached_size->natural_size;
+ g_assert (!minimum_width || !natural_width || *minimum_width <= *natural_width);
+
#if DEBUG_EXTENDED_LAYOUT
g_message ("%s returning minimum width: %d and natural width: %d",
G_OBJECT_TYPE_NAME (layout),
&minimum_height,
&natural_height);
- cached_size->minimum_size = MAX (minimum_height, requisition.height);
- cached_size->natural_size = MAX (natural_height, requisition.height);
+ minimum_height = MAX (minimum_height, requisition.height);
+ natural_height = MAX (natural_height, requisition.height);
+
+ /* XXX Possibly we should update this with minimum values instead */
+ _gtk_size_group_bump_requisition (GTK_WIDGET (layout), GTK_SIZE_GROUP_VERTICAL, natural_height);
+
+ cached_size->minimum_size = minimum_height;
+ cached_size->natural_size = natural_height;
cached_size->for_size = -1;
cached_size->age = aux_info->cached_height_age;
if (natural_height)
*natural_height = cached_size->natural_size;
+ g_assert (!minimum_height || !natural_height || *minimum_height <= *natural_height);
#if DEBUG_EXTENDED_LAYOUT
g_message ("%s returning minimum height: %d and natural height: %d",
height,
&minimum_width,
&natural_width);
+
+ minimum_width = MAX (minimum_width, requisition.width);
+ natural_width = MAX (natural_width, requisition.width);
+
+ /* XXX Possibly we should update this with minimum values instead */
+ _gtk_size_group_bump_requisition (GTK_WIDGET (layout), GTK_SIZE_GROUP_HORIZONTAL, natural_width);
- cached_size->minimum_size = MAX (minimum_width, requisition.width);
- cached_size->natural_size = MAX (natural_width, requisition.width);
+ cached_size->minimum_size = minimum_width;
+ cached_size->natural_size = natural_width;
cached_size->for_size = height;
cached_size->age = aux_info->cached_width_age;
width,
&minimum_height,
&natural_height);
-
- cached_size->minimum_size = MAX (minimum_height, requisition.height);
- cached_size->natural_size = MAX (natural_height, requisition.height);
+
+ minimum_height = MAX (minimum_height, requisition.height);
+ natural_height = MAX (natural_height, requisition.height);
+
+ /* XXX Possibly we should update this with minimum values instead */
+ _gtk_size_group_bump_requisition (GTK_WIDGET (layout), GTK_SIZE_GROUP_VERTICAL, natural_height);
+
+ cached_size->minimum_size = minimum_height;
+ cached_size->natural_size = natural_height;
cached_size->for_size = width;
cached_size->age = aux_info->cached_height_age;
label->layout = backup;
}
- if (label->single_line_mode)
+ if (label->single_line_mode || label->wrap)
required_rect.height = get_single_line_height (GTK_WIDGET (label), label->layout);
if (label->have_transform)
if (orientation == GTK_ORIENTATION_HORIZONTAL)
minimum = required_rect.width + label->misc.xpad * 2;
else
- minimum = required_rect.height + label->misc.ypad * 2;
+ {
+ minimum = required_rect.height + label->misc.ypad * 2;
+ }
/* Natural size */
natural_layout = pango_layout_copy (label->layout);
}
static void
-do_size_request (GtkWidget *widget)
+do_size_request (GtkWidget *widget, gint width, gint height)
{
if (GTK_WIDGET_REQUEST_NEEDED (widget))
{
"size-request",
&widget->requisition);
}
+
+ /* Also update size groups from _gtk_size_group_bump_requisition() */
+ widget->requisition.width = MAX (widget->requisition.width, width);
+ widget->requisition.height = MAX (widget->requisition.height, height);
}
+/* NOTE: This is only ever called for either mode horizontal or mode vertical
+ * but never as both.
+ */
static gint
compute_base_dimension (GtkWidget *widget,
- GtkSizeGroupMode mode)
+ GtkSizeGroupMode mode,
+ gint minimum)
{
- do_size_request (widget);
+ if (mode == GTK_SIZE_GROUP_HORIZONTAL)
+ do_size_request (widget, minimum, -1);
+ else /* (mode == GTK_SIZE_GROUP_VERTICAL) */
+ do_size_request (widget, -1, minimum);
return get_base_dimension (widget, mode);
}
+/* NOTE: This is only ever called for either mode horizontal or mode vertical
+ * but never as both.
+ */
static gint
compute_dimension (GtkWidget *widget,
- GtkSizeGroupMode mode)
+ GtkSizeGroupMode mode,
+ gint minimum)
{
GSList *widgets = NULL;
GSList *groups = NULL;
if (!groups)
{
- result = compute_base_dimension (widget, mode);
+ result = compute_base_dimension (widget, mode, minimum);
}
else
{
{
GtkWidget *tmp_widget = tmp_list->data;
- gint dimension = compute_base_dimension (tmp_widget, mode);
+ gint dimension = compute_base_dimension (tmp_widget, mode, minimum);
if (gtk_widget_get_mapped (tmp_widget) || !group->ignore_hidden)
{
if (mode == GTK_SIZE_GROUP_HORIZONTAL)
{
tmp_group->have_width = TRUE;
- tmp_group->requisition.width = result;
+ tmp_group->requisition.width = MAX (result, minimum);
}
else
{
tmp_group->have_height = TRUE;
- tmp_group->requisition.height = result;
+ tmp_group->requisition.height = MAX (result, minimum);
}
tmp_list = tmp_list->next;
*
* Compute the requisition of a widget taking into account grouping of
* the widget's requisition with other widgets.
- **/
+ *
+ * This is used by #GtkExtendedLayout to obtain minimum value
+ * caps for all values cached and returned to parent containers,
+ * then the extended layout while making its own sizes in multiple
+ * passes updates sizegroups with _gtk_size_group_bump_requisition().
+ */
void
_gtk_size_group_compute_requisition (GtkWidget *widget,
GtkRequisition *requisition)
if (get_size_groups (widget))
{
/* Only do the full computation if we actually have size groups */
-
- width = compute_dimension (widget, GTK_SIZE_GROUP_HORIZONTAL);
- height = compute_dimension (widget, GTK_SIZE_GROUP_VERTICAL);
+ width = compute_dimension (widget, GTK_SIZE_GROUP_HORIZONTAL, -1);
+ height = compute_dimension (widget, GTK_SIZE_GROUP_VERTICAL, -1);
if (requisition)
{
}
else
{
- do_size_request (widget);
+ do_size_request (widget, -1, -1);
if (requisition)
get_fast_child_requisition (widget, requisition);
}
}
+
+/**
+ * _gtk_size_group_bump_requisition:
+ * @widget: a #GtkWidget
+ * @mode: either %GTK_SIZE_GROUP_HORIZONTAL or %GTK_SIZE_GROUP_VERTICAL, depending
+ * on the dimension in which to bump the size.
+ * @size: The new base size in @mode's dimension for the group.
+ *
+ * This function is used to update sizegroup minimum size information
+ * in multiple passes from the new #GtkExtendedLayout manager.
+ */
+void
+_gtk_size_group_bump_requisition (GtkWidget *widget,
+ GtkSizeGroupMode mode,
+ gint size)
+{
+ initialize_size_group_quarks ();
+
+ if (get_size_groups (widget))
+ {
+ if (mode == GTK_SIZE_GROUP_HORIZONTAL)
+ compute_dimension (widget, GTK_SIZE_GROUP_HORIZONTAL, size);
+ else
+ compute_dimension (widget, GTK_SIZE_GROUP_VERTICAL, size);
+ }
+ else
+ {
+ if (mode == GTK_SIZE_GROUP_HORIZONTAL)
+ do_size_request (widget, size, -1);
+ else
+ do_size_request (widget, -1, size);
+ }
+}
+
+
/**
* _gtk_size_group_queue_resize:
* @widget: a #GtkWidget
GSList * gtk_size_group_get_widgets (GtkSizeGroup *size_group);
-void _gtk_size_group_get_child_requisition (GtkWidget *widget,
- GtkRequisition *requisition);
-void _gtk_size_group_compute_requisition (GtkWidget *widget,
- GtkRequisition *requisition);
-void _gtk_size_group_queue_resize (GtkWidget *widget);
+void _gtk_size_group_get_child_requisition (GtkWidget *widget,
+ GtkRequisition *requisition);
+void _gtk_size_group_compute_requisition (GtkWidget *widget,
+ GtkRequisition *requisition);
+void _gtk_size_group_bump_requisition (GtkWidget *widget,
+ GtkSizeGroupMode mode,
+ gint size);
+void _gtk_size_group_queue_resize (GtkWidget *widget);
+
G_END_DECLS